﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;

namespace DAO
{
    public class CuentaCorrienteDAO : IDAO<CuentaCorrienteEntity>
    {
        #region IDAO<CuentaCorrienteEntity> Members

        public int Insert(CuentaCorrienteEntity entidad)
        {
            return Persisteitor.PersistirCtaCte(entidad);
        }

        public void Delete(int id)
        {
            Persisteitor.EliminarCtaCte(id);
        }

        public void Update(CuentaCorrienteEntity entidad)
        {
            Persisteitor.ActualizarCtaCte(entidad);
        }

        public CuentaCorrienteEntity Select(int id)
        {
            return Persisteitor.SeleccionarCtaCte(id, true);
        }

        public List<CuentaCorrienteEntity> SelectAll()
        {
            return Persisteitor.SeleccionarTodasCtaCte(true);
        }

        #endregion

        public List<CuentaCorrienteEntity> ObtenerMovimintosCtaCteByUsuario(int idUsuario)
        {
            var lista = SelectAll();
            List<CuentaCorrienteEntity> cuentas = (from c in lista
                                                   where c.Usuario.Id == idUsuario
                                                   select c).ToList<CuentaCorrienteEntity>();

            return cuentas;
        }

        public float ObtenerSaldoAnterior(int idUsuario)
        {
            var lista = SelectAll();
            var ultimoMovimiento = (from c in lista 
                                    where c.Usuario.Id == idUsuario 
                                    orderby c.Id descending 
                                    select c).FirstOrDefault<CuentaCorrienteEntity>();

            float saldoAnterior = 0;

            if (ultimoMovimiento != null)
            {
                saldoAnterior = ultimoMovimiento.Saldo;
            }

            return saldoAnterior;
        }

        public List<CuentaCorrienteEntity> ObtenerPorFiltro(DateTime? desde, DateTime? hasta, int? idUsuario, string conceptoMovimiento)
        {
            var lista = SelectAll();
            var filtro = (from l in lista 
                          where ((l.FechaMovimiento >= desde || desde == null) && (l.FechaMovimiento <= hasta || hasta == null)) && 
                                (l.Usuario.Id == idUsuario || idUsuario == null) &&
                                (l.Descripcion == conceptoMovimiento || conceptoMovimiento == null) select l).ToList<CuentaCorrienteEntity>();
            return filtro;
        }      
    }
}
